Transit Gateway ConnectでAWS Transit GatewayにGREトンネル経由でルート伝搬してみる
ども、ゲストのソラコム大瀧です。
re:Inventのさなか、AWS Transit Gatewayの新機能としてTransit Gateway Connectがリリースされました。AWS Transit Gateway(以下TGW)は、VPC、Direct Connect Gateway、Site-to-Site VPN(IPsec)を相互接続できるネットワークコンポーネントで、これまでソフトウェアによる仮想ネットワークとの連携には物理的制約のないIPsec VPNが好んで利用されてきました。Transit Gateway ConnectはIPsec VPNよりパフォーマンス面で有利かつシンプルな新しい連携形式として、主にSD-WAN製品向けに利用できる機能です。
本ブログではまずその様子を確認するために、EC2のソフトウェア処理でTGWにルーティング情報を伝搬させてみます。
Transit Gateway Connectの仕組み
Transit Gateway ConnectはTGWアタッチメントのひとつとして、TGWに追加して構成します。TGWとはGREトンネルを介してBGPでルート情報を広告しますが、GREのトラフィックは暗号化されないためTGWと安全に通信するために、他のTGWアタッチメントをトランスポートアタッチメントとして利用する特徴があります。図で示すと以下の通りです。
というわけで、Transit Gateway Connectを使うためには、以下が必要です。
- Transit Gateway ConnectをサポートするリージョンのTGW
- 2020/12/15時点では US East (N. Virginia), US West (N. California), US West (Oregon), and Europe (Ireland) です。
- トランスポートアタッチメントとして利用する既存のTGWアタッチメント(VPCとDirect Connect Gatewayのどちらかで、VPNはサポートされません)
- ピアとなるホスト
今回はピアとなるホストとして、以下のEC2インスタンスとソフトウェアを利用しました。
- リージョン : オレゴンリージョン
- AMI :
ami-03c1b544a7566b3e5
(ubuntu/images/hvm-ssd/ubuntu-focal-20.04-arm64-server-20201026) - GRE : Netplan
- BGP : gobgp version 2.22.0
では、TGWとVPC、VPCへのTGWアタッチメントはそれぞれ作成済みとし、手順を追って設定していきます。
1. TGWとVPCの準備
Transit Gateway Connect作成の前にVPCとTGWの事前準備を行います。Transit Gateway ConnectではGREトンネルでピアから接続するためのリモートIPアドレスをピアごとにTGWに割り振るため、準備としてはCIDR(IPアドレスのプール)をTGWに設定します。TGW管理画面からTGWの変更(Modify)を選択し、一番下の項目[Transit Gateway CIDR blocks]の[CIDR]に他のアタッチメントと被らない任意のCIDRを入力し、[Modify transit gateway]ボタンをクリックして追加します。
続いて、Transit Gateway CIDR blockに到達するためのルーティングをVPCに追加します。これは通常のTGWへのルーティング追加と同様で、送信先にTransit Gateway CIDR block、ターゲットにTGWを指定すればOKです。(スクリーンショットには他のルーティングが映り込んでいますが、特に必要なものではありません)
2. Transit Gateway ConnectピアのEC2インスタンスの構成
続いて、Transit Gateway ConnectピアとなるEC2インスタンスを構成します。GREの通信ができれば良いので、セキュリティグループのインバウンドルールでGREのプロトコル番号47
をターゲットTransit Gateway CIDR blockから許可する設定を追加します。
このあとTGW Connectにピアを登録するため、インスタンスのプライベートIPを控えておきましょう。(今回の構成では、172.30.2.126
)
3. Transit Gateway Connectの追加
では、TGWにTransit Gateway Connectを追加し、ピアを登録します。VPC管理画面のメニューから[Transit Gateway接続]を選択し、[Create Transit Gateway Attachment]ボタンをクリックします。作成画面では、[Transit Gateway ID]でTGWを選択、[Attachment type]で「Connect」、[Transport Attachment ID]でトランスポートアタッチメントとして利用するTGWアタッチメントを選択します。
続いて、作成したTransit Gateway Connectにピアを登録します。[Connect Peers]タブを開き、「Create Connect Peer」ボタンをクリックします。
設定項目がそれなりにありますが、*
マークの必須項目以外は自動で採番されるのでお任せにします。以下の項目を入力し「Create」で作成します。
- Peer GRE address : 手順2で確認したEC2インスタンスのプライベートIP
- BGP Inside CIDR blocks IPv4 :
169.254.0.0/16
のうち予約アドレス以外の/29
のCIDRを入力
登録したピアのプロパティにこのあと設定する各項目が表示されます。横長のテーブル表示でスクリーンショットに収めにくいため(実際の画面では右にスクロールして見ます)、以下に箇条書きしますw
項目名 | 説明 | 例 |
---|---|---|
Transit Gateway GRE address | Transit Gateway CIDR blockから採番されたGREトンネルのリモートIPアドレス | 192.168.151.181 |
Peer GRE address | EC2インスタンスのプライベートIP | 172.30.2.126 |
BGP Inside CIDR blocks | GREトンネル内リンクローカルアドレスのCIDR | 169.254.6.0/29 |
Transit Gateway ASN | TGW側のBGP ASナンバー | 64512 |
Peer ASN | ピアのBGP ASナンバー(自動選択の場合はTGWと同一になりiBGPになる) | 64512 |
Peer BGP address | ピアのBGPアドレス(リンクローカルアドレス) | 169.254.6.1 |
Transit Gateway BGP 1 address | TGWの1つ目のBGPアドレス | 169.254.6.2 |
Transit Gateway BGP 2 address | TGWの2つ目のBGPアドレス | 169.254.6.3 |
この情報を元に、ピアのEC2インスタンスでGREとBGPを構成していきます。
4. ConnectピアのGRE、BGP構成
EC2にSSH接続し、GREトンネルとBGPのルート広告を設定します。まずは手順3のGREの設定を引用して以下のファイルを作成しGREトンネルを設定します。
network: tunnels: gre1: mode: gre local: 172.30.2.126 remote: 192.168.151.181 mtu: 8476 addresses: - 169.254.6.1/29
以下のコマンドで適用します。
$ sudo netplan apply $ ip a show gre1 6: gre1@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 8476 qdisc noqueue state UNKNOWN group default qlen 1000 link/gre 172.30.2.126 peer 192.168.151.181 inet 169.254.6.1/29 brd 169.254.6.7 scope global gre1 valid_lft forever preferred_lft forever $
OKですね、続いてBGPはgobgpでルート広告を設定します(実際のLinuxのルーティング操作にはQuagga/FRRoutingの設定が必要ですが今回は動作確認のため割愛します)。以下のコマンドでgobgpをダウンロードし、カレントディレクトリに配置しました。
$ wget https://github.com/osrg/gobgp/releases/download/v2.22.0/gobgp_2.22.0_linux_arm64.tar.gz $ tar zxf gobgp_2.22.0_linux_arm64.tar.gz $ ls LICENSE README.md gobgp gobgp_2.22.0_linux_arm64.tar.gz gobgpd $
手順3のBGPの設定を引用して、以下のファイルを作成します。
[global.config] as = 64512 router-id = "169.254.6.1" [[neighbors]] [neighbors.config] neighbor-address = "169.254.6.2" peer-as = 64512 [[neighbors]] [neighbors.config] neighbor-address = "169.254.6.3" peer-as = 64512
ではファイルを読み込んでデーモン(gobgpd)を実行します。
$ sudo ./gobgpd -f gobgpd.conf {"level":"info","msg":"gobgpd started","time":"2020-12-14T21:59:03Z"} {"Topic":"Config","level":"info","msg":"Finished reading the config file","time":"2020-12-14T21:59:03Z"} {"level":"info","msg":"Peer 169.254.6.2 is added","time":"2020-12-14T21:59:03Z"} {"Topic":"Peer","level":"info","msg":"Add a peer configuration for:169.254.6.2","time":"2020-12-14T21:59:03Z"} {"level":"info","msg":"Peer 169.254.6.3 is added","time":"2020-12-14T21:59:03Z"} {"Topic":"Peer","level":"info","msg":"Add a peer configuration for:169.254.6.3","time":"2020-12-14T21:59:03Z"} {"Key":"169.254.6.3","State":"BGP_FSM_OPENCONFIRM","Topic":"Peer","level":"info","msg":"Peer Up","time":"2020-12-14T21:59:10Z"} {"Key":"169.254.6.2","State":"BGP_FSM_OPENCONFIRM","Topic":"Peer","level":"info","msg":"Peer Up","time":"2020-12-14T21:59:12Z"}
この時点でBGPセッションが確立されるため、Connectピア画面のBGPステータスが UP
に変わるはずです。
続いてルーティングを広告するために別ターミナルを立ち上げ、CLI(gobgp)でルーティングエントリー10.128.0.0/10
を追加します。
$ ./gobgp global rib add 10.128.0.0/10 nexthop 169.254.6.1 origin igp aspath 100
なお、AS-PATHを空欄にするとTGWルーティングテーブルに伝搬されなかったので、適当なASを入れてみました。MED値、Local Preferenceは無しでも大丈夫でした。ドキュメントでもECMPのためにAS-PATHを設定せよとあります。
ルーティング一覧を見てみると。。。
$ ./gobgp global rib Network Next Hop AS_PATH Age Attrs *> 10.128.0.0/10 169.254.6.1 100 00:01:43 [{Origin: i}] *> 172.30.0.0/16 169.254.6.2 00:01:50 [{Origin: i} {Med: 100} {LocalPref: 100}] * 172.30.0.0/16 169.254.6.3 00:01:52 [{Origin: i} {Med: 100} {LocalPref: 100}] $
インスタンスからは広告できているようです。TGWルーティングテーブルを見てみると。。。
おおー、追加されました!
まとめ
SD-WAN向けの新機能Transit Gateway Connectを用いてEC2のソフトウェア処理でTGWにルーティング情報を伝搬させてみました。実案件ではサードパーティのSD-WANアプライアンスを利用することになると思いますが、動作原理を理解するために今回のような実験をしてみるのも良いのではないでしょうか。